home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 626-637 / disk_629 / rexxrmf / rexxrmf.lzh / addressbook.rexx < prev    next >
OS/2 REXX Batch file  |  1991-09-10  |  21KB  |  734 lines

  1. /* Example of simple AddressBook Database */
  2.  
  3. /* Define the record layout and fields within the record       */
  4. /* Note that since none of these variables have been assigned  */
  5. /* a value, their value is simply their name strings.          */
  6. /*  ie. firstname = 'FIRSTNAME' lastname = 'LASTNAME' etc.     */
  7. /* the order in which these are specified is the order that    */
  8. /* will be used to read/write them in the data file record     */
  9. /* This string represents the NAMES of the variables that will */
  10. /* be accessed directly by RexxRMF library                     */
  11.  
  12. addrrecord = " firstname lastname street city state zipcode areacode phonenumber dob sendcard"
  13.  
  14. /* the following are the same as the addrrecord, I use them    */
  15. /* when changing or deleting a record.  This aint necessary I  */
  16. /* just do it this way, you can use the same record layout for */
  17. /* all accesses if you wish.                                   */
  18.  
  19. addrchange = fnamechg lnamechg streetchg citychg statechg zipchg areachg phonechg dobchg sendchg
  20. addrdelete = fnamedel lnamedel streetdel citydel statedel zipdel areadel phonedel dobdel senddel
  21.  
  22. /* the data file will be indexed on six fields */
  23. /* index 0 - lastname - */
  24. /* index 1 - state    - */
  25. /* index 2 - zipcode  - */
  26. /* index 3 - areacode - */
  27. /* index 4 - dob      - */
  28. /* index 5 - sendcard - */
  29.  
  30.  
  31.  
  32. /* Define the special variables we want returned                       */
  33.  
  34. /* Note you need not specify any special variables be returned, this   */
  35. /* is just information for your program                                */
  36.  
  37. /* rba      - byte location of record within the data file             */
  38. /* nodeaddr - this variable will be a hex-string, which will point to  */
  39. /*          - the treenode in the primary index.                       */
  40. /* nfields  - the number fields in the record or written               */
  41.  
  42. specialrba = " @rba *0nodeaddr %nfields "
  43.  
  44. /* the following string specifies which variables the record number    */
  45. /* will be stored in when the data record is read/written              */
  46. /* the variable recnum0 will contain the relative record number for    */
  47. /* the key with respect to the primary index. the variable recnum1     */
  48. /* will contain the relative record number for the key with respect to */
  49. /* alternate index 1, etc.                                             */
  50.  
  51. specialrecn  = " =0recnum0 =1recnum1 =2recnum2 =3recnum3 =4recnum4 =5recnum5 "
  52.  
  53. /* the following string specifies which variables the occurence number  */
  54. /* will be stored in when the data record is read/written               */
  55. /* the variable occr0 will contain the occurence number for the key in  */
  56. /* primary index.  the variable occr1 will contain the occurence number */
  57. /* for the key in alternate index 1, etc.                               */
  58.  
  59. specialoccr = " #0occr0 #1occr1 #2occr2 #3occr3 #4occr4 #5occr5 "
  60.  
  61. /* the following string specifies which variables the keys           */
  62. /* will be stored in when the data record is read/written            */
  63. /* Note the keys are taken from the index NOT the datafile           */
  64. /* the variable key0 will contain the key from the primary index     */
  65. /* the variable key1 will contain the key from the alternate index 1 */
  66. /* etc.                                                              */
  67.  
  68. specialkey = " &0key0 &1key1 &2key2 &3key3 &4key4 &5key5 "
  69.  
  70.  
  71. /* Now create single string with the record layout and special variables */
  72. /* the order in which the strings are concatenated does not matter       */
  73. /* But remember variables that are not preceded by a special symbol      */
  74. /* will be considered to be the next data field in the record.  ie. the  */
  75. /* non-special variables are positional                                  */
  76.  
  77. addrrecord = specialrba specialkey addrrecord specialrecn specialoccr 
  78. addrchange = specialrba specialkey addrchange specialrecn specialoccr 
  79. addrdelete = specialrba specialkey addrdelete specialrecn specialoccr 
  80.  
  81.  
  82. x = addlib("RexxRMF.library",0,-30,0)  /* make the lib avaiable */
  83.  
  84. if exists("addrbook") = 0 then 
  85.    do
  86.       x = delete("addrbook")
  87.       if exists("addrbook.rmfindex") = 1 then 
  88.          x = delete("addrbook.rmfindex") 
  89.       ix = open_rmf("addrbook")
  90.       call loaddatafile()
  91.    end
  92. else
  93.    ix = open_rmf("addrbook")
  94.  
  95.  
  96.  
  97. if ix = '0000 0000'x then  /* if NULL did not open */
  98.    do
  99.       say "Index did not open"
  100.       exit
  101.    end
  102.    
  103. do forever
  104.  
  105.    call displaymenu
  106.    parse pull msel 
  107.    msel = upper(msel)
  108.    select 
  109.           when msel = 'Z' then 
  110.                do
  111.                    x = read_rmf_record(ix,0,addrrecord,27,'R') 
  112.                    if x = 1 then
  113.                    call printrecord
  114.                    x = next_rmf_record(ix,0,addrrecord)
  115.                    if x = 1 then
  116.                    call printrecord
  117.                    x = next_rmf_record(ix,0,addrrecord)
  118.                    if x = 1 then
  119.                    call printrecord
  120.                    x = next_rmf_record(ix,0,addrrecord)
  121.                    if x = 1 then
  122.                    call printrecord
  123.                    x = next_rmf_record(ix,0,addrrecord)
  124.                    if x = 1 then
  125.                    call printrecord
  126.                end
  127.           when msel = 'A' then
  128.                do
  129.                 call addarecord
  130.                end
  131.  
  132.           when msel = 'C' then
  133.                do
  134.                 call changearecord
  135.                end
  136.  
  137.           when msel = 'K' then
  138.                do
  139.                 call changerecordbykey
  140.                end
  141.  
  142.           when msel = 'D' then
  143.                do
  144.                 call deletearecord
  145.                end
  146.  
  147.           when msel = 1 then
  148.                do
  149.                 call searchbylastname
  150.                end
  151.                
  152.           when msel = 2 then
  153.                do
  154.                 call searchbyzipcode
  155.                end
  156.                
  157.           when msel = 3 then
  158.                do
  159.                 call searchbyareacode
  160.                end
  161.                
  162.           when msel = 4 then
  163.                do
  164.                 call searchbycardlist
  165.                end
  166.                
  167.           when msel = 5 then
  168.                do
  169.                 call searchbyrecordnumber
  170.                end
  171.                
  172.           when msel = 6 then
  173.                do
  174.                 call displayarecord
  175.                end
  176.                
  177.           when msel = 'I' then
  178.                do
  179.                 call showindexinfo
  180.                end
  181.                
  182.           when msel = 'X' then leave
  183.  
  184.           otherwise nop
  185.    end
  186. end
  187. x = close_rmf(ix)
  188. say "close returned " x
  189. exit
  190.  
  191. /* -------------------------------------------------------- */
  192. /* -------------------------------------------------------- */
  193.  
  194. displaymenu:
  195.    say "          Select Options Menu"
  196.    say ""
  197.    say "       A.    Add Record"
  198.    say "       C.    Change Record by Number"
  199.    say "       K.    Change Record by Key"
  200.    say "       D.    Delete Record by Key"
  201.    say "       I.    Index Information  (Displays value of all keys)"
  202.    say ""
  203.    say "       1.    Search By LastName"
  204.    say "       2.    Search By ZipCode"
  205.    say "       3.    Search By AreaCode"
  206.    say "       4.    Search By CardList"
  207.    say "       5.    Search By Record Number"
  208.    say "       6.    Display All"
  209.    say ""
  210.    say "       X.    Exit"
  211.    x = writech(stdout,"   Enter Menu Selection From Above: ")
  212.    
  213. return 1
  214.  
  215.  
  216. /* -------------------------------------------------------- */
  217. /* -------------------------------------------------------- */
  218.  
  219. addarecord:
  220. x = writech(stdout,"   FirstName ? ")
  221. parse pull firstname
  222. x = writech(stdout,"   LastName ? ")
  223. parse pull lastname
  224. x = writech(stdout,"   Street ? ")
  225. parse pull street 
  226. x = writech(stdout,"   City ? ")
  227. parse pull city
  228. x = writech(stdout,"   State ? ")
  229. parse pull state  
  230.  
  231. x = writech(stdout,"   ZipCode ? ")
  232. parse pull zipcode
  233.  
  234. x = writech(stdout,"   areacode ? ")
  235. parse pull areacode
  236.  
  237. x = writech(stdout,"   phonenumber ? ")
  238. parse pull phonenumber
  239.  
  240. x = writech(stdout,"   Date of Birth ? ")
  241. parse pull dob
  242.  
  243. x = writech(stdout,"   Christmas Card ? ")
  244. parse pull sendcard
  245.  
  246. newkey = upper(lastname) /* gonna use upper case for our keys */
  247.  
  248. x = write_rmf_record(ix,addrrecord,newkey,1,state,2,zipcode,3,areacode,4,dob,5,sendcard) 
  249.  
  250. /* NOTE the value of 'rba' was set by the write_rmf_record call */
  251.  
  252. if x = 1 then 
  253.    say " Record written at location"   rba   "in file" nfields "fields written"
  254. else
  255.    say "Record not written "
  256.  
  257. return x
  258.  
  259. /* -------------------------------------------------------- */
  260. /* -------------------------------------------------------- */
  261.  
  262. changearecord:
  263.  
  264. x = writech(stdout,"   Record Number ? ")
  265.  
  266. parse pull updrecnum
  267.  
  268. /* read the current values in the record, this is VERY important  */
  269. /* when doing updating. UPDATE_RMF_RECORD uses the current values */
  270. /* of the ARexx variables in the record layout string             */
  271.  
  272. x = read_rmf_record(ix,0,addrrecord,updrecnum,'R') 
  273.  
  274. if x = 0 then 
  275.    do
  276.       say "Record Not Found"
  277.       return 0
  278.    end
  279.  
  280. say ""
  281. say ""
  282. say "Current Record Values"
  283. say ""
  284. call printrecord
  285. say ""
  286.  
  287. x = writech(stdout,"   FirstName ? ")
  288. parse pull fnamechg
  289. if fnamechg = "" then
  290.    fnamechg = firstname
  291.    
  292.  
  293. x = writech(stdout,"   LastName ? ")
  294. parse pull lnamechg
  295. if lnamechg = "" then 
  296.    lnamechg = lastname
  297.  
  298. x = writech(stdout,"   Street ? ")
  299. parse pull streetchg 
  300. if streetchg = "" then
  301.    streetchg = street
  302.  
  303. x = writech(stdout,"   City ? ")
  304. parse pull citychg
  305. if citychg = "" then 
  306.    citychg = city
  307.  
  308. x = writech(stdout,"   State ? ")
  309. parse pull statechg
  310. if statechg = "" then 
  311.    statechg = state
  312.  
  313. x = writech(stdout,"   ZipCode ? ")
  314. parse pull zipchg
  315. if zipchg = "" then 
  316.    zipchg = zipcode
  317.  
  318. x = writech(stdout,"   areacode ? ")
  319. parse pull areachg
  320. if areachg = "" then 
  321.    areachg = areacode
  322.  
  323. x = writech(stdout,"   phonenumber ? ")
  324. parse pull phonechg
  325. if phonechg = "" then 
  326.    phonechg = phonenumber
  327.  
  328. x = writech(stdout,"   Date of Birth ? ")
  329. parse pull dobchg
  330. if dobchg = "" then 
  331.    dobchg = dob
  332.  
  333. x = writech(stdout,"   Christmas Card ? ")
  334. parse pull sendchg
  335. if sendchg = "" then 
  336.    sendchg = sendcard
  337.  
  338. chgkey = upper(lastname)
  339.  
  340.             say " Change to this: "
  341.             say "    " fnamechg lnamechg
  342.             say "    " streetchg
  343.             say "    " citychg statechg zipchg
  344.             say "    " areachg phonechg
  345.             say "    " dobchg sendchg
  346.             say ""
  347.  
  348. x = update_rmf_record(ix,addrchange,updrecnum,1,statechg,2,zipchg,3,areachg,4,dobchg,5,sendchg) 
  349. if x = 1 then 
  350.    say " Record Updated "
  351. else
  352.    say " Record NOT Updated "
  353.  
  354. return 1
  355.  
  356.  
  357. /* -------------------------------------------------------- */
  358. /* -------------------------------------------------------- */
  359.  
  360. changerecordbykey:
  361.  
  362. x = writech(stdout,"   Last Name ? ")
  363. parse pull oldkey
  364. oldkey = upper(oldkey)
  365. x = read_rmf_record(ix,0,addrrecord,oldkey,'K')
  366. if x = 0 then 
  367.    do
  368.       say "Record Not Found"
  369.       return 0
  370.    end
  371.  
  372. say "Current Record Values "
  373. say ""
  374. call printrecord
  375. say ""
  376.  
  377. x = writech(stdout,"   FirstName ? ")
  378. parse pull fnamechg
  379. if fnamechg = "" then
  380.    fnamechg = firstname
  381.    
  382.  
  383. x = writech(stdout,"   LastName ? ")
  384. parse pull lnamechg
  385. if lnamechg = "" then 
  386.    lnamechg = lastname
  387.  
  388. x = writech(stdout,"   Street ? ")
  389. parse pull streetchg 
  390. if streetchg = "" then
  391.    streetchg = street
  392.  
  393. x = writech(stdout,"   City ? ")
  394. parse pull citychg
  395. if citychg = "" then 
  396.    citychg = city
  397.  
  398. x = writech(stdout,"   State ? ")
  399. parse pull statechg
  400. if statechg = "" then 
  401.    statechg = state
  402.  
  403. x = writech(stdout,"   ZipCode ? ")
  404. parse pull zipchg
  405. if zipchg = "" then 
  406.    zipchg = zipcode
  407.  
  408. x = writech(stdout,"   areacode ? ")
  409. parse pull areachg
  410. if areachg = "" then 
  411.    areachg = areacode
  412.  
  413. x = writech(stdout,"   phonenumber ? ")
  414. parse pull phonechg
  415. if phonechg = "" then 
  416.    phonechg = phonenumber
  417.  
  418. x = writech(stdout,"   Date of Birth ? ")
  419. parse pull dobchg
  420. if dobchg = "" then 
  421.    dobchg = dob
  422.  
  423. x = writech(stdout,"   Christmas Card ? ")
  424. parse pull sendchg
  425. if sendchg = "" then 
  426.    sendchg = sendcard
  427.  
  428. chgkey = upper(lnamechg)
  429.             say ""
  430.             say "    " fnamechg lnamechg
  431.             say "    " streetchg
  432.             say "    " citychg statechg zipchg
  433.             say "    " areachg phonechg
  434.             say "    " dobchg sendchg
  435.             say ""
  436.  
  437. x = update_rmf_key(ix,addrchange,oldkey,1,chgkey,1,statechg,2,zipchg,3,areachg,4,dobchg,5,sendchg) 
  438. if x = 1 then 
  439.    
  440.    say " Record Updated "
  441. else
  442.    say " Record NOT Updated "
  443.       
  444. return 1
  445.  
  446. /* -------------------------------------------------------- */
  447. /* -------------------------------------------------------- */
  448.  
  449. deletearecord:
  450.  
  451. x = writech(stdout,"Last Name ? ")
  452.  
  453. parse pull key
  454. key = upper(key)
  455. x = delete_rmf_record(ix,0,addrdelete,key,'K',1)  /* this always deletes first occurence */
  456.  
  457. if x = 1 then 
  458.    do
  459.    say ""
  460.    say "Record has been deleted "
  461.    say "    " fnamedel lnamedel "@rba" rba
  462.    say "    " streetdel
  463.    say "    " citydel statedel zipdel
  464.    say "    " areadel phonedel
  465.    say "    " dobdel senddel
  466.    say ""
  467.    end
  468. else
  469.    say "Record not deleted "
  470.  
  471.    
  472. return x
  473.  
  474. /* -------------------------------------------------------- */
  475. /* -------------------------------------------------------- */
  476.  
  477. displayarecord:
  478.  
  479.       recnum = 1
  480.       do forever 
  481.          x = read_rmf_record(ix,0,addrrecord,recnum,'R')
  482.          if x = 0 then leave
  483.          call printrecord
  484.          recnum = recnum + 1
  485.       end
  486.       
  487. return 1
  488.  
  489. /* -------------------------------------------------------- */
  490. /* -------------------------------------------------------- */
  491.  
  492. searchbystate:
  493.  
  494. /* index 1 is used for folks in a zip code */
  495.  
  496.       x = writech(stdout," Enter (2 letter abbrv.) State ? ")
  497.       parse pull statekey
  498.       statekey = upper(statekey)
  499.  
  500.       x = read_rmf_record(ix,1,addrrecord,statekey,'K')
  501.       if x = 0 then 
  502.          do
  503.            say " No one in the State of " statekey
  504.            return 0
  505.          end
  506.       
  507.       do forever
  508.          call printrecord
  509.          x = next_rmf_record(ix,1,addrrecord)
  510.          if x = 0 then leave
  511.       end      
  512.       
  513. return 1
  514.  
  515.  
  516. /* -------------------------------------------------------- */
  517. /* -------------------------------------------------------- */
  518.  
  519. searchbyzipcode:
  520.  
  521. /* index 2 is used for folks in a zip code */
  522.  
  523.       x = writeln(stdout," partial ZipCode keys will match ")
  524.       x = writech(stdout," Enter ZipCode ? ")
  525.       parse pull zipkey
  526.       zipkey = upper(zipkey)
  527.  
  528.       /* 'partial' keyed read */
  529.       x = read_rmf_record(ix,2,addrrecord,zipkey,'P')
  530.       if x = 0 then 
  531.          do
  532.            say " Zip Code Not Found"
  533.            return 0
  534.          end
  535.       
  536.       do forever
  537.          call printrecord
  538.          x = next_rmf_record(ix,2,addrrecord)
  539.          if x = 0 then leave
  540.       end      
  541.       
  542. return 1
  543.  
  544.  
  545. /* -------------------------------------------------------- */
  546. /* -------------------------------------------------------- */
  547.  
  548. searchbyareacode:
  549.  
  550. /* index 3 is used for folks in an area code */
  551.  
  552.       x = writech(stdout," Enter AreaCode ? ")
  553.       parse pull areakey
  554.       areakey = upper(areakey)
  555.  
  556.       x = read_rmf_record(ix,3,addrrecord,areakey,'K')
  557.       if x = 0 then 
  558.          do
  559.             say ""
  560.             say " Area Code NOT FOUND"
  561.             say ""
  562.             return 0
  563.          end
  564.       
  565.       say ""
  566.       say " Records with AREACODE " areakey
  567.       say ""
  568.       do forever
  569.          call printrecord
  570.          x = next_rmf_record(ix,3,addrrecord)
  571.          if x = 0 then leave
  572.       end      
  573.       
  574. return 1
  575.  
  576.  
  577. /* -------------------------------------------------------- */
  578. /* -------------------------------------------------------- */
  579.  
  580. searchbycardlist:
  581.  
  582. /* index 5 is used for folks on the card list */
  583.  
  584.       x = writeln(stdout," Enter 'Y' to find folks on your Christmas Card List ")
  585.       x = writeln(stdout," Enter 'N' to find folks NOT on your Christmas Card List ")
  586.       x = writeln(stdout," 'Y' is the default ")
  587.       x = writech(stdout," Enter Y/N ? ")
  588.       parse pull cardkey
  589.       cardkey = upper(cardkey)
  590.  
  591.       x = read_rmf_record(ix,5,addrrecord,cardkey,'K')
  592.       if x = 0 then 
  593.          do
  594.             say "No one found "
  595.             return 0
  596.          end
  597.       
  598.       say ""
  599.       if cardkey = 'Y' then
  600.          say " Folks on your Chirstmas Card List "
  601.       else
  602.          say " Folks NOT on your Chirstmas Card List "
  603.       say ""
  604.       do forever
  605.          call printrecord
  606.          x = next_rmf_record(ix,5,addrrecord)
  607.          if x = 0 then leave
  608.       end      
  609.       
  610. return 1
  611.  
  612. /* -------------------------------------------------------- */
  613. /* -------------------------------------------------------- */
  614.  
  615. searchbyrecordnumber:
  616.  
  617.  
  618.       x = writech(stdout," Enter Record Number ? ")
  619.       
  620.       parse pull recordnum
  621.       
  622.       x = read_rmf_record(ix,0,addrrecord,recordnum,'R')
  623.       
  624.       if x = 0 then 
  625.          do
  626.             say "Record Number" recordnum " NOT FOUND "
  627.             return 0
  628.          end
  629.          
  630.       /* NOTE  'recnum0' was set by the read_rmf_record call   */   
  631.       /*       'recnum0' is the relative record number for the */
  632.       /*       record in index0 (the primary index)            */
  633.       /*       'recnum0' should equal recordnum specified, if  */
  634.       /*       not then their is problem with the RMF lib      */
  635.       /*       the value of 'rba' was also set by the read_rmf */
  636.       /*       the value of 'occr0' was also set               */
  637.       
  638.       say ""
  639.       say ""
  640.       say " Record" recnum0 "Occurence:" occr0 "  at location: " rba
  641.       call printrecord
  642.       
  643. return 1
  644.  
  645.  
  646. /* -------------------------------------------------------- */
  647. /* -------------------------------------------------------- */
  648.  
  649. searchbylastname:
  650.  
  651.       x = writech(stdout," Last Name? ")
  652.       parse pull keyname
  653.       keyname = upper(keyname)
  654.  
  655.       x = read_rmf_record(ix,0,addrrecord,keyname,'K')
  656.       
  657.       if x = 0 then 
  658.          do
  659.             say " Record with that NOT FOUND"
  660.             return 0
  661.          end
  662.       
  663.       do forever  /* print first find, then any multiple occurences */
  664.       
  665.            say ""
  666.            say ""
  667.            say " Record" key0 "Occurence: " occr0 " at location:" rba 
  668.            call printrecord
  669.            
  670.            x = next_rmf_record(ix,0,addrrecord)
  671.            
  672.            if x = 0 then leave
  673.            
  674.       end      
  675.       
  676. return 1
  677.  
  678. /* -------------------------------------------------------- */
  679. /* -------------------------------------------------------- */
  680.  
  681. showindexinfo:
  682. x = writech(stdout,"Number of records to display ?")
  683. parse pull recnum
  684. say ""
  685. say "            LastName    State      ZipCode  AreaCode    DOB    SendCard  "
  686. say "             Index0     Index1     Index2    Index3    Index4   Index5 "
  687. say "            --------   --------   --------  --------  -------- --------" 
  688. say ""
  689. do i = 1 to recnum
  690.    x = read_rmf_record(ix,0,addrrecord,i,'R')
  691.    if x = 0 then iterate /* leave */
  692.    say "RBA:" substr(rba,1,6)  substr(key0,1,12) substr(key1,1,9) substr(key2,1,9) substr(key3,1,9) substr(key4,1,9) substr(key5,1,9) 
  693.    say "RECORD:    " substr(recnum0,1,12) substr(recnum1,1,9) substr(recnum2,1,9) substr(recnum3,1,9) substr(recnum4,1,9) substr(recnum5,1,9)
  694.    say "OCCURENCE: " substr(occr0,1,12) substr(occr1,1,9) substr(occr2,1,9) substr(occr3,1,9) substr(occr4,1,9) substr(occr5,1,9)
  695.    say ""
  696. end
  697. return 1
  698.  
  699. /* -------------------------------------------------------- */
  700. /* -------------------------------------------------------- */
  701.  
  702. loaddatafile: procedure expose ix addrrecord 
  703. do forever
  704. x = open(infile,"datafile",'R')
  705. line = readln(infile)
  706. if eof(infile) = 1 then leave
  707. if substr(line,1,1) = '#' then iterate
  708. parse var line firstname ',' lastname ',' street ',' city ',' state ',' zipcode ',' areacode ',' phonenumber ',' dob ',' sendcard
  709. writekey  = upper(lastname)
  710. statekey = upper(state)
  711. sendkey  = upper(sendcard)
  712. x = write_rmf_record(ix,addrrecord,writekey,1,statekey,2,zipcode,3,areacode,4,dob,5,sendkey) 
  713. end
  714. x = close(infile)
  715. return 1
  716.  
  717. /* -------------------------------------------------------- */
  718. /* -------------------------------------------------------- */
  719.  
  720. printrecord:
  721.    say "      Record number:" recnum0 "contains " nfields "fields" 
  722.    say ""
  723.    say "      Name   :" firstname lastname
  724.    say "      Street :" street
  725.    say "      City   :" city 
  726.    say "      State  :" state
  727.    say "      Zip    :" zipcode
  728.    say "      Phone  :" "(" || areacode || ")" phonenumber
  729.    say "      DOB    :" dob "   Christmas Card:" sendcard
  730.    say ""
  731.    say "      ***              ***            *** "
  732.    say ""
  733. return 1
  734.